package iface.aplicativo.negocio.aps;

import iface.aplicativo.excecao.MensagemException;
import iface.aplicativo.integracao.dao.FabricanteDAO;
import iface.aplicativo.negocio.entidade.Fabricante;
import iface.aplicativo.util.Constantes;
import iface.aplicativo.util.ResourceMessageFactory;
import iface.aplicativo.util.UtilResource;
import iface.arquitetura.comum.string.UtilString;
import iface.arquitetura.utilitario.ResourceMessageAnnotation;

import java.util.Collection;

import javax.annotation.Resource;

import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional(readOnly = true, rollbackFor = { Exception.class })
public class ManterFabricantesAPS {

	@ResourceMessageAnnotation(propertiesFile = { Constantes.RECURSO_MENSAGENS })
	private UtilResource resource = ResourceMessageFactory.inicialize(this);

	@Resource
	FabricanteDAO fabricanteDAO;

	@Transactional(propagation = Propagation.REQUIRED)
	public String salvarFabricante(Fabricante entidade) throws Exception {
		this.validarCamposFabricante(entidade);
		this.validarExistencia(entidade);

		if (entidade.getId() == null) {
			this.fabricanteDAO.inserir(entidade);
			return this.resource.getMensagens("MSG01");
		} else {
			this.fabricanteDAO.alterar(entidade);
			return this.resource.getMensagens("MSG02");
		}
	}

	@Transactional(propagation = Propagation.REQUIRED)
	public String excluirFabricante(Fabricante entidade) throws Exception {
		try {
			this.fabricanteDAO.remover(entidade);
		} catch (DataIntegrityViolationException ex) {
			throw new MensagemException(this.resource.getMensagens("MGS18"));
		} catch (Exception ex) {
			throw new Exception(ex);
		}
		return this.resource.getMensagens("MSG03");
	}

	public void validarCamposFabricante(Fabricante entidade) throws Exception {
		this.resource.clearMensagens();

		if (entidade != null) {
			if (UtilString.isVazio(entidade.getNmFabricante())) {
				this.resource.addMensagens("MSG05", "Fabricante");
			}
		}

		if (this.resource.isMensagens()) {
			throw new MensagemException(this.resource.getMensagens());
		}
	}

	public void validarExistencia(Fabricante entidade) throws Exception {
		this.resource.clearMensagens();

		Fabricante fabricanteConsulta = this.fabricanteDAO
				.consultarPorNomeFabricante(entidade);

		if (fabricanteConsulta != null) {
			this.fabricanteDAO.getHibernateTemplate().clear();
			if (entidade.getId() != null) {
				if (!fabricanteConsulta.getId().equals(entidade.getId())) {
					this.resource.addMensagens("MSG15");
				}
			} else {
				this.resource.addMensagens("MSG15");
			}
		}

		if (this.resource.isMensagens()) {
			throw new MensagemException(this.resource.getMensagens());
		}
	}

	public Fabricante consultarFabricantePorNome(String nmFabricante)
			throws Exception {
		Fabricante entidade = null;
		try {
			entidade = this.fabricanteDAO.obter(nmFabricante);
		} catch (Exception ex) {
			throw new Exception(ex);
		}
		return entidade;
	}

	public Fabricante consultarFabricantePorId(Long id) throws Exception {
		Fabricante entidade = null;
		try {
			entidade = this.fabricanteDAO.obter(id);
		} catch (Exception ex) {
			throw new Exception(ex);
		}
		return entidade;
	}

	public Collection<Fabricante> consultarTodosFabricantes() {
		return this.fabricanteDAO.consultar();
	}

}
